package net.nahiyak.thread.th01;

/**
 * Created by nahiya on 2014-12-23.
 */
public class WhatIsThread {
    public static void main(String[] args) throws InterruptedException {
        // 프로세스란 실행 중인 프로그램을 나타내는 말로서 디스크에 저장되어 있는 프로그램이 실행되면 그 프로그램은 자신의 고유한 메모리 공간에 프로그램의 코드가 읽혀질 것이고 CPU는 메모리에 로드된 프로그램의 명령어를 하나하나 읽어서 실행하게 될 것이다. 그리고 이렇게 실행 중인 상태의 프로그램을 우리는 프로세스(Process) 또는 태스크 (Task) 라 부른다.
        // 프로세스는 스레드에게 실행 환경을 제공해주는 컨테이너 역할을 한다.
        // 스레드는 프로세스내에서 독립적인 실행흐름을 말한다.
        // 스레드별 stack 공간을 할당 받게 되며 나머지 메모리 영역을 프로세스 내의 모든 스레들과 공유하게된다.
        // 데이더 공유에 따른 스레드간 동기화 처리가 반드시 필요.
        // 프로세스 보다 가볍다는 의미로 light-weight process 라고 불린다.
        // 하나의 프로세스내에서 하나 이상의 프로그램 수행흐름을 형성하고 이를 동시처리함으로써 실행 속도 및 응답시간의 향상 시키는데 목적이 있다.

        // 상태
        // 1. new
        // - 인스턴스가 생성되어있지만 start 되지 않은 상태.
        // 2. runnable
        // - 실행 가능한 상태, CPU 자원을 할당 받을 수 있는 상태.
        // - running, ready(대기중) 상태
        // 3. un runnable
        // - 실행 불가한 상태, CPU 자원을 할당 받을 수 없는 상태.
        // - blocked
        //   > blocking
        //     ] blocking i/o 입출력 작업이 완료 될때까지 대기
        //   > synchronized
        //     ] 동기화 대상 인스턴스의 Monitor Lock 을 획득 하기 위해 대기
        // - waiting
        //   > object -> syncObj.wait() :
        //     ] 다른 스레드에 의해 notify 될 때까지 현재 스레드를 대기
        //     ] 소유한 모니터락의 wait set 에 현제 스레드를 대기시키면서 소유한 모니터락을 반환한다.
        //   > join()
        //     ] 대상 스레드(호출된 스레드)가 종료할 때까지 현재 스레드를 대기시킨다.
        // - time_waiting
        //   > Thread.sleep(long)
        //     ] 현재 스레드를 지정한 시간동안 대기
        //   > object.wait(long)
        //     ] 다른 스레드에 의해 notify 될 때까지 지정한 시간동안 현재 스레드를 대기
        //   > join(long)
        //     ] 대상 스레드(호출된 스레드)가 종료할 때까지 지정한 시간동안 현재 스레드를 대기.
        // 4. terminated

        // yield
        // 다른 스레드가 실행할 수 있도록 현재 실행중인 스레드를 실행준비 상태(Running -> Ready 상태)로 만들어 준다.

        // interrupt
        // 실행중인 쓰레드는 인터럽트 신호를 받아도 본인이 확인하기 전까지는 이를 알지 못한다.
        // 블로킹 상태의 쓰레드는 인터럽트 신호를 받으면 곧바로 깨어난다. 하지만 깨어났을때에는 이미 인터럽트 신호가 해제된 상태이다.
        // > 실행중이 스래드
        //   ] isInterrupt 로 반드시 확인해야함. (true 로 지속)
        //   ] interrupted 는 처음 true 후 false 로 값을 바꿈
        // > un runnable(블록킹 상태)
        //   ] 반드시 깨어난다.
        //   ] 깨어났을 경우 인터럽트 신호는 false이다.

   }
}